package jit.hf.agriculture.Repository;

import jit.hf.agriculture.domain.TestUser;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.transaction.annotation.Transactional;


/**
 * @Auther: zj
 * @Date: 2018/8/6 19:54
 * @Description:自定义方法，将mysql与redis操作结合起来（mysql通过jpa,redis通过注解）
 */
@CacheConfig(cacheNames = "TestUser")
public interface TestUserRepository extends JpaRepository<TestUser, Integer> {

    @Cacheable(key = "#p0")// #p0代表第一个参数，也就是id。这句话加上之后，当你在调用findById时，
                            // 就会先从redis的TestUser(@CacheConfig(cacheNames = "TestUser")通过这个注解指定)缓存对象里去查询key等于传过来的id的值。
                            // 如果没有，就去查表。
    TestUser findById(int id);

        /**
         * 新增或修改时
         */
    @CachePut(key = "#p0.id")//在save方法上加了个CachePut，代表往缓存里添加值，key为参数post的id属性，
                                // 这样当我们save一个Post对象时，redis就会新增一个以id为key的Post对象；
                            // 如果是update操作，那同样，redis会覆盖id相同的Post对象的值，也完成一次更新。
    @Override
    TestUser save(TestUser testUser);

    @Transactional
    @Modifying
    @CacheEvict(key = "#p0")//该注解的作用是：同时删除mysql和redis的数据；不然mysql删掉了但redis不会删除
    int deleteById(int id);

}
